A slice is a three-field struct — pointer to underlying array, length, and capacity. Append reuses the existing array if capacity allows, otherwise allocates a new larger array.
Append always returns the new slice — the original slice header is not modified
Sub-slices share the underlying array — mutations are visible across all sub-slices
Use copy() to create an independent slice when you need isolation
Pre-allocate with make([]T, 0, expectedSize) to avoid repeated reallocations in loops
Growth factor is approximately 2x for small slices, decreasing for very large slices